/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.cxf.profile;
import com.ctc.wstx.sax.WstxSAXParserFactory;
import com.sun.xml.fastinfoset.dom.DOMDocumentParser;
import com.sun.xml.fastinfoset.sax.SAXDocumentParser;
import com.sun.xml.fastinfoset.sax.SAXDocumentSerializer;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.sax.SAXSource;
import org.jvnet.fastinfoset.FastInfosetException;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.SAXNotRecognizedException;
import org.xml.sax.SAXNotSupportedException;
import org.xml.sax.XMLReader;
public class FastInfosetExperiment {
private DocumentBuilder documentBuilder;
TransformerFactory transformerFactory;
private File fiFile;
private final static int iterCount = 10000;
private FastInfosetExperiment() throws ParserConfigurationException {
documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
transformerFactory = TransformerFactory.newInstance();
transformerFactory.setFeature(javax.xml.XMLConstants.FEATURE_SECURE_PROCESSING, true);
fiFile = new File("fiTest.fixml");
}
private void dehydrate(InputStream input, OutputStream output) throws ParserConfigurationException, SAXException, IOException {
// Create Fast Infoset SAX serializer
SAXDocumentSerializer saxDocumentSerializer = new SAXDocumentSerializer();
// Set the output stream
saxDocumentSerializer.setOutputStream(output);
// Instantiate JAXP SAX parser factory
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
/* Set parser to be namespace aware
* Very important to do otherwise invalid FI documents will be
* created by the SAXDocumentSerializer
*/
saxParserFactory.setNamespaceAware(true);
// Instantiate the JAXP SAX parser
SAXParser saxParser = saxParserFactory.newSAXParser();
// Set the lexical handler
saxParser.setProperty("http://xml.org/sax/properties/lexical-handler", saxDocumentSerializer);
// Parse the XML document and convert to a fast infoset document
saxParser.parse(input, saxDocumentSerializer);
}
private void readWithWoodstox() throws SAXException, TransformerConfigurationException, TransformerException, IOException {
InputStream is = getClass().getResourceAsStream("/META-INF/cxf/cxf.xml");
WstxSAXParserFactory woodstoxParserFactory;
woodstoxParserFactory = new WstxSAXParserFactory();
woodstoxParserFactory.setFeature("http://xml.org/sax/features/namespace-prefixes",
true);
SAXParser parser = woodstoxParserFactory.newSAXParser();
XMLReader reader = parser.getXMLReader();
SAXSource saxSource = new SAXSource(reader, new InputSource(is));
Document document;
document = documentBuilder.newDocument();
DOMResult domResult = new DOMResult(document);
transformerFactory.newTransformer().transform(saxSource, domResult);
is.close();
}
private void readWithFI() throws TransformerConfigurationException, TransformerException, IOException {
InputStream is = new FileInputStream(fiFile);
XMLReader saxReader = new SAXDocumentParser();
InputStream in = new BufferedInputStream(is);
SAXSource saxSource = new SAXSource(saxReader, new InputSource(in));
Document document;
document = documentBuilder.newDocument();
DOMResult domResult = new DOMResult(document);
transformerFactory.newTransformer().transform(saxSource, domResult);
is.close();
}
private void readWithFIDom() throws FastInfosetException, IOException {
InputStream is = new FileInputStream(fiFile);
DOMDocumentParser ddp = new DOMDocumentParser();
Document document;
document = documentBuilder.newDocument();
ddp.parse(document, is);
is.close();
}
private void benchmark() throws ParserConfigurationException, SAXException, IOException, TransformerConfigurationException, TransformerException, FastInfosetException {
InputStream is = getClass().getResourceAsStream("/META-INF/cxf/cxf.xml");
OutputStream os = new FileOutputStream(fiFile);
dehydrate(is, os);
is.close();
os.close();
long totalTime = 0;
for(int x = 0; x < iterCount; x ++) {
long startTime = System.nanoTime();
readWithWoodstox();
long endTime = System.nanoTime();
totalTime += endTime - startTime;
}
double averageNanos = totalTime / iterCount;
System.out.println("Woodstox average us: " + averageNanos / 1000);
totalTime = 0;
for(int x = 0; x < iterCount; x ++) {
long startTime = System.nanoTime();
readWithFI();
long endTime = System.nanoTime();
totalTime += endTime - startTime;
}
averageNanos = totalTime / iterCount;
System.out.println("FastInfoset average us: " + averageNanos / 1000);
totalTime = 0;
for(int x = 0; x < iterCount; x ++) {
long startTime = System.nanoTime();
readWithFIDom();
long endTime = System.nanoTime();
totalTime += endTime - startTime;
}
averageNanos = totalTime / iterCount;
System.out.println("FastInfoset DOM average us: " + averageNanos / 1000);
}
public static void main(String[] args) throws Exception {
FastInfosetExperiment that = new FastInfosetExperiment();
that.benchmark();
}
}